package xcache

import (
	"sync"
	"time"
)

// 缓存钩子
type CacheInterface interface {
	Get(name string) string                       // 获取缓存值，缓存未找到的话请返回空字符串
	Set(name string, val string, t time.Duration) // 设置缓存值，可能存在部分无法在string中正常显示的字符串
}

// 默认缓存信息
var _default CacheInterface = &CacheInterfaceExport{}

// 缓存锁机制，用户缓存组配置
var _default_cache_sync sync.RWMutex
var _default_cache_time time.Duration = time.Minute

// 设置缓存组件依赖
//
//	c	实现缓存接口的值
func SetCache(c CacheInterface) {
	_default = c
}

// 设置缓存的默认时长
//
//	t	默认缓存时长
func SetCacheTime(t time.Duration) {
	_default_cache_time = t
}

// 缓存分组
var group map[string][]string = map[string][]string{}

// 分组值添加
//
//	name	分组名称
//	key		分组中的值
func groupAdd(name, key string) {
	_default_cache_sync.Lock()
	defer _default_cache_sync.Unlock()
	if name == "" {
		name = "_default"
	}
	group[name] = append(group[name], key)
}

// 获取全部缓存，用于清空使用
func groupAll() []string {
	_default_cache_sync.RLock()
	defer _default_cache_sync.RUnlock()
	t := []string{}
	for _, v := range group {
		t = append(t, v...)
	}
	return t
}

// 清空全部分组信息
func groupClearAll() {
	_default_cache_sync.Lock()
	defer _default_cache_sync.Unlock()
	group = map[string][]string{}
}

// 分组值获取
//
//	name	分组名称
func groupGet(name string) []string {
	_default_cache_sync.RLock()
	defer _default_cache_sync.RUnlock()
	if name == "" {
		name = "_default"
	}
	v, ok := group[name]
	if ok {
		return v
	}
	return []string{}
}

// 分组删除
//
//	name	分组名称
func groupRemove(name string) {
	_default_cache_sync.Lock()
	defer _default_cache_sync.Unlock()
	if name == "" {
		name = "_default"
	}
	delete(group, name)
}
